package com.kazusa.myservlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

/*
* session对象获取
*   request.getSession()方法可以获取session对象，如果session不存在，则创建新的session对象。
*   常用方法：
*    getId()：获取session的会话标识符
*    getCreationTime()：获取session的创建时间
*    getLastAccessedTime()：获取最后一次访问时间
*
* */

@WebServlet("/session1")
public class Session extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session对象
        HttpSession session=request.getSession();

        //获取session的会话标识符
        String id=session.getId();
        System.out.println("会话标识符"+id);
        /*获取session的创建时间*/
        System.out.println("创建时间"+session.getCreationTime());
        //获取最后一次访问时间
        System.out.println("最后一次访问时间"+session.getLastAccessedTime());
        //判断是否是新的session对象
        System.out.println("是否是新的session对象"+session.isNew());
    }
}
/*
* Session 既然是为了标识一次会话，那么此次会话就应该有一个唯一的标志，这个标志就是
* sessionId。
* 每当一次请求到达服务器，如果开启了会话（访问了 session），服务器第一步会查看是否从客户端
* 回传一个名为 JSESSIONID 的 cookie，如果没有则认为这是一次新的会话，会创建 一个新的 session 对
* 象，并用唯一的 sessionId 为此次会话做一个标志。如果有 JESSIONID 这 个cookie回传，服务器则会根
* 据 JSESSIONID 这个值去查看是否含有id为JSESSION值的session 对象，如果没有则认为是一个新的会
* 话，重新创建一个新的 session 对象，并标志此次会话； 如果找到了相应的 session 对象，则认为是之
* 前标志过的一次会话，返回该 session 对象，数据达到共享。
* 这里提到一个叫做 JSESSIONID 的 cookie，这是一个比较特殊的 cookie，当用户请求服务器时，如果
* 访问了 session，则服务器会创建一个名为 JSESSIONID，值为获取到的 session（无论是获取到的还是
* 新创建的）的 sessionId 的 cookie 对象，并添加到 response 对象中，响应给客户端，有效时间为关闭
* 浏览器。
所以 Session 的底层依赖 Cookie 来实现
* */